<?php
/**
 * 数据库连接类
 * 使用单例模式实现
 */
class Database {
    private static $instance = null;
    private $conn;
    
    /**
     * 构造函数
     * 连接数据库
     */
    private function __construct() {
        // 从配置文件获取数据库连接信息
        $host = DB_HOST;
        $user = DB_USER;
        $pass = DB_PASS;
        $name = DB_NAME;
        
        try {
            $this->conn = new PDO("mysql:host=$host;dbname=$name;charset=utf8mb4", $user, $pass);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            $this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        } catch (PDOException $e) {
            die("数据库连接失败: " . $e->getMessage());
        }
    }
    
    /**
     * 获取实例
     * 
     * @return Database
     */
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    /**
     * 获取数据库连接
     * 
     * @return PDO
     */
    public function getConnection() {
        return $this->conn;
    }
    
    /**
     * 执行SQL查询
     * 
     * @param string $sql SQL语句
     * @param array $params 参数数组
     * @return PDOStatement
     */
    public function query($sql, $params = []) {
        $stmt = $this->conn->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }
    
    /**
     * 获取单行数据
     * 
     * @param string $sql SQL语句
     * @param array $params 参数数组
     * @return array|false 数据数组或false
     */
    public function fetch($sql, $params = []) {
        $stmt = $this->query($sql, $params);
        return $stmt->fetch();
    }
    
    /**
     * 获取多行数据
     * 
     * @param string $sql SQL语句
     * @param array $params 参数数组
     * @return array 数据数组
     */
    public function fetchAll($sql, $params = []) {
        $stmt = $this->query($sql, $params);
        return $stmt->fetchAll();
    }
    
    /**
     * 获取最后插入的ID
     * 
     * @return string 最后插入的ID
     */
    public function lastInsertId() {
        return $this->conn->lastInsertId();
    }
    
    /**
     * 开始事务
     */
    public function beginTransaction() {
        $this->conn->beginTransaction();
    }
    
    /**
     * 提交事务
     */
    public function commit() {
        $this->conn->commit();
    }
    
    /**
     * 回滚事务
     */
    public function rollback() {
        $this->conn->rollBack();
    }
}
